package com.toommi.refuse.tools;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Formatter;

public class SignUtil {


    // Token与接口配置信息中的Token要一致
    private static final String TOKEN = "wsf";

    /**
     * 验证签名
     *
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static boolean checkSignatrue(String signature, String timestamp,
                                         String nonce) {
        // 创建一个签名数组
        String[] arr = new String[] { TOKEN, timestamp, nonce };
        // 将TOKEN timestamp nonce三个参数进行数据字典排序
        Arrays.sort(arr);
        // 实例化一个 StringBuilder
        StringBuilder content = new StringBuilder();
        // 循环字符串数组
        for (int i = 0; i < arr.length; i++) {
            // 将数组元素循环拼接进 StringBuilder
            content.append(arr[i]);
        }
        // 初始化 MessageDigest 对象
        MessageDigest md = null;
        // 初始化 字符串 tmpStr
        String tmpStr = null;
        // 给 MessageDigest 对象 赋值
        try {
            md = MessageDigest.getInstance("SHA-1");
            // 将三个参数字符串拼接成一个字符串进行sha1加密
            byte[] digest = md.digest(content.toString().getBytes());
            tmpStr = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();
        }
        // 将 StringBuilder 赋值为空
        content = null;
        // 将sha1加密后的字符串可与signature对比
        return  !"".equals(tmpStr)?true: false;
    }


    /**
     * 获取签名
     *

     * @return
     */
    public static String getSignatrue(String noncestr,
                                      String jsapi_ticket,String timestamp,String url) {
        String string1;

        //注意这里参数名必须全部小写，且必须有序
        string1 = "jsapi_ticket=" + jsapi_ticket +
                "&noncestr=" + noncestr +
                "&timestamp=" + timestamp +
                "&url=" + url;
        // 初始化 MessageDigest 对象
        MessageDigest md = null;
        // 初始化 字符串 tmpStr
        String tmpStr = null;
        // 给 MessageDigest 对象 赋值
        try {
            md = MessageDigest.getInstance("SHA-1");
            // 将三个参数字符串拼接成一个字符串进行sha1加密
//			byte[] digest = md.digest(content.toString().getBytes());
//			tmpStr = byteToStr(digest);
            md.reset();
            md.update(string1.getBytes("UTF-8"));
            tmpStr = byteToHex(md.digest());
        } catch (Exception e) {

            e.printStackTrace();
        }

        // 将sha1加密后的字符串可与signature对比
        return  tmpStr;
    }
    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash)
        {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }
    /**
     * 将字节数组转换为十六进制字符串
     *
     * @param byteArray
     * @return
     */
    private static String byteToStr(byte[] byteArray) {
        String strDigest = "";
        for (int i = 0; i < byteArray.length; i++) {
            strDigest += byteToHexStr(byteArray[i]);
        }
        return strDigest;
    }

    /**
     * 将字节转换为十六进制字符串
     *
     * @param mByte
     * @return
     */
    private static String byteToHexStr(byte mByte) {
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
                'B', 'C', 'D', 'E', 'F' };
        char[] tempArr = new char[2];
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
        tempArr[1] = Digit[mByte & 0X0F];
        String s = new String(tempArr);
        return s;
    }

    public static void main(String[]arg){
        checkSignatrue("123","123","123");
    }
}
